package com.midea.designPatterns;

/**
 * @description：
 * @author: wangwl23
 * @create: 2020-12-02 17:07
 * 双检锁，又叫双重校验锁，综合了懒汉式和饿汉式两者的优缺点整合而成。看上面代码实现中，特点是在synchronized关键字内外都加了一层 if 条件判断
 * 这样既保证了线程安全，又比直接上锁提高了执行效率，还节省了内存空间。
 */
public class Singleton_DoubleCheck {
    //DCL双重校验锁不一定线程安全，原因是有指令重排序的存在
    //应该加上volatile，禁止指令重排序优化
    private volatile static Singleton_DoubleCheck singleton = null;
    private Singleton_DoubleCheck(){}
    public static Singleton_DoubleCheck getInstance(){
        if (singleton == null){
            synchronized (Singleton_DoubleCheck.class){
                if (singleton == null){
                    singleton = new Singleton_DoubleCheck();
                }
            }
        }
        return singleton;
    }
}
